package com.doctor.web.controller;

import com.doctor.common.core.controller.BaseController;
import com.doctor.common.core.page.TableDataInfo;
import com.doctor.common.utils.DateUtils;
import com.doctor.common.utils.SecurityUtils;
import com.doctor.web.domain.ProductDO;
import com.doctor.web.service.ProductService;
import com.doctor.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 *  商品
 *
 * @since 2025-04-11
 */
@RestController
@RequestMapping("/maincode/product")
public class ProductController extends BaseController {

    @Autowired
    private ProductService productService;

    /**
     * 新增商品
     * @param productDO 商品实体
     * @return 新增结果
     */
    @PreAuthorize("@ss.hasPermi('maincode:product:add')")
    @PostMapping("/add")
    public AjaxResult addProduct(@RequestBody ProductDO productDO) {
        productDO.setCreateTime(new Date());
        productDO.setCreateBy(SecurityUtils.getUserId().toString());
        boolean result = productService.save(productDO);
        if (result) {
            return AjaxResult.success("商品添加成功");
        } else {
            return AjaxResult.error("商品添加失败");
        }
    }

    /**
     * 删除商品
     * @param id 商品 ID
     * @return 删除结果
     */
    @PreAuthorize("@ss.hasPermi('maincode:product:delete')")
    @PostMapping("/delete/{id}")
    public AjaxResult deleteProduct(@PathVariable Long id) {
        boolean result = productService.removeById(id);
        if (result) {
            return AjaxResult.success("商品删除成功");
        } else {
            return AjaxResult.error("商品删除失败");
        }
    }

    /**
     * 修改商品信息
     * @param productDO 商品实体
     * @return 修改结果
     */
    @PreAuthorize("@ss.hasPermi('maincode:product:update')")
    @PostMapping("/update")
    public AjaxResult updateProduct(@RequestBody ProductDO productDO) {
        productDO.setUpdateTime(DateUtils.getNowDate());
        boolean result = productService.updateById(productDO);
        if (result) {
            return AjaxResult.success("商品修改成功");
        } else {
            return AjaxResult.error("商品修改失败");
        }
    }

    /**
     * 用户查询商品列表
     */
    @GetMapping("/list")
    public TableDataInfo list() {
        startPage();
        List<ProductDO> list = productService.getProductList();
        return getDataTable(list);
    }

    /**
     * 查询单个商品
     * @param id 商品 ID
     * @return 商品实体
     */
    @GetMapping("/{id}")
    public AjaxResult getProduct(@PathVariable Long id) {
        ProductDO productDO = productService.getById(id);
        if (productDO != null) {
            return AjaxResult.success("商品查询成功", productDO);
        } else {
            return AjaxResult.error("未找到该商品");
        }
    }

    /**
     * 用户按分类标签分类展示商品
     * @param categoryName 分类名称
     * @return 商品列表
     */
    @GetMapping("/listByCategory/{categoryName}")
    public TableDataInfo getProductsByCategory(@PathVariable Integer categoryName) {
        startPage();
        List<ProductDO> productList = productService.getProductsByCategory(categoryName);
        return getDataTable(productList);
    }

    /**
     * 用户按销量降序排序展示商品
     * @return 商品列表
     */
    @GetMapping("/sortBySalesDesc")
    public TableDataInfo getProductsSortedBySalesDesc() {
        startPage();
        List<ProductDO> productList = productService.getProductsSortedBySalesDesc();
        return getDataTable(productList);
    }

    /**
     * 用户按价格升序排序展示商品
     * @return 商品列表
     */
    @GetMapping("/sortByPriceAsc")
    public TableDataInfo getProductsSortedByPriceAsc() {
        startPage();
        List<ProductDO> productList = productService.getProductsSortedByPriceAsc();
        return getDataTable(productList);
    }

    /**
     * 用户按价格降序排序展示商品
     * @return 商品列表
     */
    @GetMapping("/sortByPriceDesc")
    public TableDataInfo getProductsSortedByPriceDesc() {
        startPage();
        List<ProductDO> productList = productService.getProductsSortedByPriceDesc();
        return getDataTable(productList);
    }
}